package com.example.ccj.u.media;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;

import com.example.ccj.u.FileUtils;
import com.example.ccj.u.ImageUtils;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.interfaces.OnBitmapWatermarkEventListener;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.utils.DateUtils;
import com.luck.picture.lib.utils.PictureFileUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * 选择照片水印
 */
public class MeBitmapWatermarkEventListener implements OnBitmapWatermarkEventListener {
    private final String targetPath;
    List<PhotoWaterMarkText> drawText;
    List<String> markStr;


    /**
     *
     * @param context 上下文
     * @param drawText 需要绘制的文字
     */
    public MeBitmapWatermarkEventListener(Context context, List<PhotoWaterMarkText> drawText) {
        File externalFilesDir = context.getExternalFilesDir("");
        File customFile = new File(externalFilesDir.getAbsolutePath(), "Mark");
        FileUtils.createOrExistsFile(customFile);
        targetPath = customFile.getAbsolutePath() + File.separator;
        this.drawText = drawText;
    }

    public MeBitmapWatermarkEventListener(String targetPath, List<PhotoWaterMarkText> drawText) {
        this.drawText = drawText;
        this.targetPath = targetPath;
    }

    @Override
    public void onAddBitmapWatermark(Context context, String srcPath, String mimeType, OnKeyValueResultCallbackListener call) {
        if (PictureMimeType.isHasHttp(srcPath) || PictureMimeType.isHasVideo(mimeType)) {
            // 网络图片和视频忽略，有需求的可自行扩展
            call.onCallback(srcPath, "");
        } else {
            // 暂时只以图片为例
            Glide.with(context).asBitmap().sizeMultiplier(0.6F).load(srcPath).into(new CustomTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    Bitmap watermark  = drawWaterMark(context,resource.getWidth(),resource.getHeight());
                    Bitmap watermarkBitmap = ImageUtils.createWaterMaskLeftBottom(context, resource, watermark, 15, 15);
                    watermarkBitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream);
                    watermarkBitmap.recycle();
                    FileOutputStream fos = null;
                    String result = null;
                    try {
                        File targetFile = new File(targetPath, DateUtils.getCreateFileName("Mark_") + ".jpg");
                        fos = new FileOutputStream(targetFile);
                        fos.write(stream.toByteArray());
                        fos.flush();
                        result = targetFile.getAbsolutePath();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        PictureFileUtils.close(fos);
                        PictureFileUtils.close(stream);
                    }
                    if (call != null) {
                        call.onCallback(srcPath, result);
                    }
                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {
                    if (call != null) {
                        call.onCallback(srcPath, "");
                    }
                }
            });
        }
    }

    private static final String TAG = "MeBitmapWatermarkEventL";

    /**
     * 照片水印
     * @param context
     * @param width 原图 的宽度
     * @param height 原图的高度
     * @return
     */
    private Bitmap drawWaterMark(Context context,int width,int height){
        int sp = height/60;
        int waterHeight = sp*2+10;
        int leftPadding = 30;

        if (drawText != null) {
            waterHeight  += drawText.size() * sp;
        }

        //创建了一个 宽度与要画水印Bitmap一致 的 ARGB_8888 类型的空白位图对象
        Bitmap bitmap = Bitmap.createBitmap(width, waterHeight, Bitmap.Config.ARGB_8888);
        //创建画布对象
        Canvas canvas = new Canvas(bitmap);

        //绘制文字
        Paint paint = new Paint();

        paint.setColor(Color.BLUE);
        //设置线条的宽度，注意是 float 类型，在 Android 中最细的线条不是 1，可以比 1 更小
        //更细。
//        paint.setStrokeWidth(20);
        //绘制一个矩形
        canvas.drawRect(new Rect(0 ,0, 20, waterHeight), paint);

        // 防锯齿
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
        //设置文本的对齐方式，可选值有 Paint.Align.LEFT、Paint.Align.CENTER、Paint.Align.RIGHT
        //等。
        paint.setTextAlign(Paint.Align.LEFT);
        paint.setColor(Color.RED);

        //设置文本大小，单位是 px，这个和我们平时使用的字体单位 sp 不同，所以最好进行转
        //换。
        paint.setTextSize(sp);
        //设置文本的倾斜程度，skewx 取值于 0~1 之间，正负表示倾斜的方向 正表示向左倾斜。
//        paint.setTextSkewX(0.5f);
        //给文本添加下载线，underline 为 true 表示添加
//        paint.setUnderlineText(true);
        //设置文本的粗体样式，bold 为 true 表示粗体。
//        paint.setFakeBoldText(true);

        int y = sp;

        if (drawText != null) {
            for (PhotoWaterMarkText s : drawText) {
                if (s.color != 0) paint.setColor(s.color);
                canvas.drawText(s.text ,leftPadding, y, paint);
                y += sp;
            }
        }

//        canvas.drawText("创  建  人："+ YongJiuCunChu.getInstance().getString("user_name"), leftPadding, y, paint);
//        y += sp;
//        canvas.drawText("创建时间："+TimeUtil.getTimeTypeOne(), leftPadding, y, paint);

        return bitmap;
//        //绘制图形
//        //设置绘制的图形是空心样式还是实心样式，默认为实心样式。
//        //，FILL 表示实心样式，对于闭合图形来说，会用指定的颜色进行填充；STROKE 表
//        //示空心样式，绘制时只有线条而无填充效果；FILL_AND_STROKE 表示同时使用实心样
//        //式和空心样式。
//        paint.setStyle(Paint.Style.STROKE);
//        paint.setColor(Color.parseColor("#FF0000"));
//        //设置线条的宽度，注意是 float 类型，在 Android 中最细的线条不是 1，可以比 1 更小
//        //更细。
//        paint.setStrokeWidth(20);
//        //当绘图样式为 STROKE 时，该方法用于指定线条连接处的拐角样式，能使绘制的图形
//        //更加平滑。
//        paint.setStrokeJoin(Paint.Join.ROUND);
//        //绘制一个矩形
//        canvas.drawRect(new Rect(10, 200, 350, 350), paint);
    }


}
